/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.foxinline.manager.criar;

import br.com.foxinline.enums.ProjetoStatus;
import br.com.foxinline.enums.TipoDocumento;
import br.com.foxinline.modelo.*;
import br.com.foxinline.servico.*;
import br.com.foxinline.util.Msg;
import br.com.foxinline.utilitarios.ArquivoUtilitario;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.Serializable;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.DualListModel;

/**
 *
 * @author laverson
 */
@ManagedBean
@ViewScoped
public class ManagerCriarProjeto implements Serializable {

    @EJB
    ProjetoServico projetoServico;
    @EJB
    UsuarioServico usuarioServico;
    @EJB
    SituacaoServico situacaoServico;
    @EJB
    ComentarioServico comentarioServico;
    @EJB
    LancamentoServico lancamentoServico;
    @EJB
    PessoaServico pessoaServico;
    @EJB
    SecretariaServico secretariaServico;
    @EJB
    MensagemServico mensagemServico;
    private Projeto projeto;
    private List<Situacao> situacoes;
    private List<Lancamento> lancamentos;
    private Secretaria secretaria;
    private Usuario usuarioLogado;
    private Usuario responsavel;
    private Usuario responsavelPesquisar;
    private List<Usuario> usuarios;
    private String nome;
    private Pessoa empresa;
    private Endereco endereco;
    private Endereco enderecoempresa;
    private Pessoa empresaPesquisar;
    private ArquivoUtilitario arquivoProtocolo;
    private List<Secretaria> secretarias;
    private List<Pessoa> empresas;
    private DualListModel<Usuario> acompanhantes;
    private Secretaria secretariaPesquisar;

    @PostConstruct
    public void init() {
        acompanhantes = new DualListModel<Usuario>(usuarioServico.pesquisarTodos(), new ArrayList<Usuario>());
        projeto = new Projeto();
        empresa = new Pessoa();
        endereco = new Endereco();
        enderecoempresa = new Endereco();
        empresaPesquisar = new Pessoa();
        empresa.setTipoDocumento(TipoDocumento.CNPJ);
        responsavel = new Usuario();
        responsavelPesquisar = new Usuario();
        situacoes = new ArrayList<Situacao>();
        lancamentos = new ArrayList<Lancamento>();
        secretaria = new Secretaria();
        secretariaPesquisar = new Secretaria();
        secretarias = new ArrayList<Secretaria>();
        usuarioLogado = usuarioServico.getCurrentUser();
        arquivoProtocolo = new ArquivoUtilitario();
    }

    public void salvar() {
        try {
            if (responsavel.getId() != null) {
                Msg.messagemError("O responsável pelo projeto deve ser informado !");
                return;
            }
            if (empresa.getId() != null) {
                projeto.setEmpresa(empresa);
            }
            if (secretaria != null && secretaria.getId() != null) {
                projeto.setSecretaria(secretaria);
            }
            if (acompanhantes.getTarget() != null || !acompanhantes.getTarget().isEmpty()) {
                projeto.setAcompanhantes(acompanhantes.getTarget());
            }
            projeto.setResponsavel(responsavel);
            projeto.setEndereco(endereco);
            projeto.setSituacoes(situacoes);
            projeto.setLancamentos(lancamentos);
            projeto.setDataEntrada(new Date());

            Situacao s = new Situacao();
            SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
            s.setTitulo("PROJETO CADASTRADO NO SISTEMA");
            s.setDescricao("Projeto iniciado, cadastrado por " + usuarioLogado.getNome() + " às " + sdf.format(new Date()));
            s.setDataEntrada(new Date());
            s.setEstagio(0);
            s.setDataCriacao(new Date());
            s.setUsuario(usuarioLogado);
            s.setProjetoStatus(ProjetoStatus.INICIADO);
            projeto.setEstagio(0);
            projeto.setSituacoes(Arrays.asList(s));

            projetoServico.salvar(projeto);

            sendMsg();

            Long id = projeto.getId();
            init();

            Msg.messagemInfoRedirect(Msg.SuccessFull, "visualizarprojeto.xhtml?vProjeto=" + id);

        } catch (Exception e) {
            e.printStackTrace();
            Msg.messagemError(Msg.Failure);
        }
    }

    public void sendMsg() {
        Mensagem mensagem = new Mensagem();
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
        //MENSAGEM DE NOVA SITUAÇÃO
        if (projeto != null && projeto.getId() != null) {
            //QUEM ACOMPANHA
            for (Usuario usuario : projeto.getAcompanhantes()) {

                if ((projeto.getResponsavel() != null && usuario != projeto.getResponsavel())
                        && (projeto.getUsuario() != null && usuario != projeto.getUsuario())) {
                    mensagem = new Mensagem();
                    mensagem.setProjeto(projeto);
                    mensagem.setUserFrom(projeto.getUsuario());
                    mensagem.setUserTo(usuario);
                    mensagem.setDateMessage(new Date());
                    mensagem.setSubject("Novo projeto " + projeto.getNome());
                    mensagem.setText(projeto.getUsuario() + " adicionou você como acompanhante do projeto "
                            + projeto.getNome() + ", visualize-o para mais detalhes");
                    mensagemServico.salvar(mensagem);
                }

            }

            //RESPONSÁVEL PROJETO
            if (projeto.getResponsavel() != null) {
                mensagem.setId(null);
                mensagem.setText(projeto.getUsuario() + " adicionou você como responsável do projeto "
                        + projeto.getNome() + ", visualize-o para mais detalhes");
                mensagem.setUserTo(projeto.getResponsavel());
                mensagemServico.salvar(mensagem);
            }

        }
        mensagem = new Mensagem();
    }

    public Endereco getEnderecoempresa() {
        return enderecoempresa;
    }

    public void setEnderecoempresa(Endereco enderecoempresa) {
        this.enderecoempresa = enderecoempresa;
    }

    public DualListModel<Usuario> getAcompanhantes() {
        return acompanhantes;
    }

    public void setAcompanhantes(DualListModel<Usuario> acompanhantes) {
        this.acompanhantes = acompanhantes;
    }

    public Pessoa getEmpresa() {
        return empresa;
    }

    public void setEmpresa(Pessoa empresa) {
        this.empresa = empresa;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public List<Lancamento> getLancamentos() {
        return lancamentos;
    }

    public void setLancamentos(List<Lancamento> lancamentos) {
        this.lancamentos = lancamentos;
    }

    public Projeto getProjeto() {
        return projeto;
    }

    public void setProjeto(Projeto projeto) {
        this.projeto = projeto;
    }

    public Secretaria getSecretaria() {
        return secretaria;
    }

    public void setSecretaria(Secretaria secretaria) {
        this.secretaria = secretaria;
    }

    public List<Situacao> getSituacoes() {
        return situacoes;
    }

    public void setSituacoes(List<Situacao> situacoes) {
        this.situacoes = situacoes;
    }

    public Usuario getUsuarioLogado() {
        return usuarioLogado;
    }

    public void setUsuarioLogado(Usuario usuarioLogado) {
        this.usuarioLogado = usuarioLogado;
    }

    public Usuario getResponsavel() {
        return responsavel;
    }

    public void setResponsavel(Usuario responsavel) {
        this.responsavel = responsavel;
    }

    public Secretaria getSecretariaPesquisar() {
        return secretariaPesquisar;
    }

    public void setSecretariaPesquisar(Secretaria secretariaPesquisar) {
        this.secretariaPesquisar = secretariaPesquisar;
    }

    public List<Secretaria> getSecretarias() {
        return secretarias;
    }

    public void setSecretarias(List<Secretaria> secretarias) {
        this.secretarias = secretarias;
    }

    public Usuario getResponsavelPesquisar() {
        return responsavelPesquisar;
    }

    public void setResponsavelPesquisar(Usuario responsavelPesquisar) {
        this.responsavelPesquisar = responsavelPesquisar;
    }

    public List<Usuario> getUsuarios() {
        return usuarios;
    }

    public void setUsuarios(List<Usuario> usuarios) {
        this.usuarios = usuarios;
    }

    public Pessoa getEmpresaPesquisar() {
        return empresaPesquisar;
    }

    public void setEmpresaPesquisar(Pessoa empresaPesquisar) {
        this.empresaPesquisar = empresaPesquisar;
    }

    public List<Pessoa> getEmpresas() {
        return empresas;
    }

    public void setEmpresas(List<Pessoa> empresas) {
        this.empresas = empresas;
    }

    public Endereco getEndereco() {
        return endereco;
    }

    public void setEndereco(Endereco endereco) {
        this.endereco = endereco;
    }

    public void handleAnnex(FileUploadEvent event) throws IOException {
        try {
            if (projeto.getAnexos() == null) {
                projeto.setAnexos(new ArrayList<Anexo>());
            }
            projeto.getAnexos().add(arquivoProtocolo.adicionarArquivo(event));


        } catch (FileNotFoundException ex) {
            Logger.getLogger(ManagerCriarProtocolo.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(ManagerCriarProtocolo.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * Remove o anexo da lista de anexos do processo que está sendo adicionado e
     * remove o arquivo do diretório que foi gravado
     *
     * @param anexo
     */
    public void removerAnexo(Anexo anexo) {
        try {
            arquivoProtocolo.excluirArquivo(new File(anexo.getUrl() + anexo.getNome()));
            projeto.getAnexos().remove(anexo);
        } catch (Exception e) {
            Msg.messagemError(Msg.Failure);
        }
    }

    public void existeCliente() {
        Pessoa p = pessoaServico.existProprietario(empresa);

        if (p != null) {
            empresa = p;
        } else {
            empresa.setId(null);
        }
    }

    public void removerSecretaria() {
        this.secretaria = new Secretaria();
    }

    public void setarSecretaria(Secretaria secretaria) {
        this.secretaria = secretaria;
    }

    public void pesquisarSecretaria() {
        secretarias = secretariaServico.pesquisarSecretaria(secretariaPesquisar);
    }

    public void removerResponsavel() {
        this.responsavel = new Usuario();
    }

    public void setarResponsavel(Usuario usuario) {
        this.responsavel = usuario;
    }

    public void pesquisarResponsavel() {
        usuarios = usuarioServico.pesquisarUsuario(responsavelPesquisar);
    }

    public void removerEmpresa() {
        this.empresa = new Pessoa();
    }

    public void setarEmpresa(Pessoa pessoa) {
        this.empresa = pessoa;
        enderecoempresa = this.empresa.getEndereco();

    }

    public void pesquisarEmpresa() {
        empresaPesquisar.setTipoDocumento(TipoDocumento.CNPJ);
        empresas = pessoaServico.find(empresaPesquisar, null);
    }
}
